﻿// 205 求距离2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <memory.h>


using namespace std;
/*
http://oj.daimayuan.top/course/14/problem/633

给你一张 n个点 m条边的无向简单图，点的编号为 1到 n
，每条边的长度要不是 0要不是 1。

现在有 k组询问，每组询问我们想知道两个点 u,v的距离。

输入格式
第一行三个整数 n,m,k分别表示图的点数、边数和询问数。

接下来 m行，每行三个整数 x,y,z
，表示 x号点和 y号点之间有一条长度为 z的边。

接下来 k行，每行两个整数 u,v表示一组询问。

输出格式
输出共 k行，对于每一组询问，输出一行一个数表示两个点的距离，如果两个点不连通，输出 -1。

样例输入
4 4 1
1 2 0
1 3 1
2 4 1
3 4 1
1 4
样例输出
1
数据规模
对于所有数据，保证 2≤n≤20000,0≤m≤100000,1≤k≤10,1≤x,y,u,v≤n,x≠y,0≤z≤1。
*/

int n, m, k, s, t;
int dist[20001];
vector<pair<int, int>> edge[20001];
vector<int> c[20001];

int main() {
	scanf("%d%d%d", &n, &m, &k);
	//接收输入
	for (int i = 1; i <= m; i++) {
		int x, y, z;
		scanf("%d%d%d", &x, &y, &z);
		edge[x].push_back({ y,z });
		edge[y].push_back({ x,z });
	}

	for (; k--;) {
		scanf("%d%d", &s, &t);
		//初始化dist 初始化 距离某个点层级的记录
		memset(dist, -1, sizeof dist);
		for (int i = 0; i <= n; i++) { c[i].clear(); }
		dist[s] = 0; //s到start的距离为0
		c[0].push_back(s);  //0层级距离的点记录添加s点
		for (int i = 0; !c[i].empty(); i++) {
			//在某个层级做bfs
			int front = 0; int rear = c[i].size() - 1;
			while (front <= rear) {
				int x = c[i][front];
				++front;
				//bfs 对于当前层级的点 权重为0 且未被访问 ,作为和当前点一样的层级放入队列中
				//去更新dist
				for (auto y : edge[x]) {
					if (!y.second && dist[y.first] == -1) {
						dist[y.first] = dist[x];
						c[i].push_back(y.first);
						rear++;
					}
				}
			}
			//到达终点
			if (dist[t] != -1) { break; }

			//所有 当前层级且当前点可以到达的0距离点 全部bfs完毕
			//剩下的距离为1的 当前点可以达到的点 作为dist+1 放入 下一层级遍历
			for (int j = 0; j <= rear; j++) {
				int x = c[i][j];
				for (auto y : edge[x]) {
					if (y.second && dist[y.first] == -1) {
						dist[y.first] = dist[x] + 1;
						c[i + 1].push_back(y.first);
					}
				}
			}
		}
		printf("%d\n", dist[t]);
	}

	return 0;
}